home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue38 / Survive / Demo1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-08-25  |  6.0 KB  |  260 lines

  1. unit Demo1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   Grids, DBGrids, DBTables, Db, ExtCtrls, DBCtrls, StdCtrls;
  8.  
  9. type
  10.   TfrmMain = class(TForm)
  11.     DBGrid1: TDBGrid;
  12.     DBNavigator1: TDBNavigator;
  13.     btnNew: TButton;
  14.     btnSave: TButton;
  15.     btnClose: TButton;
  16.     Label1: TLabel;
  17.     cboQuaID: TComboBox;
  18.     DBGrid2: TDBGrid;
  19.     qrySubset: TQuery;
  20.     dsSubset: TDataSource;
  21.     btnExecuteQuery: TButton;
  22.     Memo1: TMemo;
  23.     btnGenerateQuery: TButton;
  24.     procedure FormCreate(Sender: TObject);
  25.     procedure btnSaveClick(Sender: TObject);
  26.     procedure btnCloseClick(Sender: TObject);
  27.     procedure cboQuaIDClick(Sender: TObject);
  28.     procedure btnNewClick(Sender: TObject);
  29.     procedure DBNavigator1BeforeAction(Sender: TObject;
  30.       Button: TNavigateBtn);
  31.     procedure btnExecuteQueryClick(Sender: TObject);
  32.     procedure btnGenerateQueryClick(Sender: TObject);
  33.   private
  34.   protected
  35.     procedure LoadQualifierSet(aID: Integer);
  36.     procedure PopulateQuaIDDropDown;
  37.     procedure GenerateWhereClause(aQuaID: Integer; aWhereClause: TStrings);
  38.   public
  39.   end;
  40.  
  41. var
  42.   frmMain: TfrmMain;
  43.  
  44. implementation
  45.  
  46. uses dmDemo;
  47.  
  48. {$R *.DFM}
  49.  
  50. procedure TfrmMain.LoadQualifierSet(aID: Integer);
  51. begin
  52.   with DemoDM.qryQualifiers do
  53.   begin
  54.     if Active then Close;
  55.     Params[0].AsInteger := aID;
  56.     Open;
  57.   end;
  58. end;
  59.  
  60. procedure TfrmMain.PopulateQuaIDDropDown;
  61. begin
  62.   with cboQuaID, DemoDM.qryQuaIDLookup do
  63.   begin
  64.     Items.Clear;
  65.     Open;
  66.     First;
  67.     while not Eof do
  68.     begin
  69.       Items.Add(IntToStr(Fields[0].AsInteger));
  70.       Next;
  71.     end;
  72.     Close;
  73.   end;
  74. end;
  75.  
  76. procedure TfrmMain.FormCreate(Sender: TObject);
  77. begin
  78.   PopulateQuaIDDropDown;
  79. end;
  80.  
  81. procedure TfrmMain.btnSaveClick(Sender: TObject);
  82. var
  83.   ID: Integer;
  84.   BMark: TBookmark;
  85. begin
  86.   with DemoDM, qryQualifiers do
  87.   begin
  88.     Database.StartTransaction;
  89.     try
  90.       if Trim(cboQuaID.Text) = '' then
  91.         with qryMaxQuaIDLookup do
  92.         begin
  93.           Open;
  94.           ID := Fields[0].AsInteger;
  95.           Close;
  96.         end
  97.       else
  98.         ID := StrToInt(cboQuaID.Text);
  99.  
  100.       DisableControls;
  101.       BMark := GetBookmark;
  102.       try
  103.         First;
  104.         while not Eof do
  105.         begin
  106.           Edit;
  107.           FieldByName('quaID').AsInteger := ID;
  108.           Post;
  109.           Next;
  110.         end;
  111.       finally
  112.         GotoBookmark(BMark);
  113.         FreeBookmark(BMark);
  114.         EnableControls;
  115.       end;
  116.       ApplyUpdates;
  117.       Database.Commit;
  118.       CommitUpdates;
  119.       PopulateQuaIDDropDown;
  120.     except
  121.       Database.Rollback;
  122.       raise;
  123.     end;
  124.   end;
  125. end;
  126.  
  127. procedure TfrmMain.btnCloseClick(Sender: TObject);
  128. begin
  129.   Close;
  130. end;
  131.  
  132. procedure TfrmMain.cboQuaIDClick(Sender: TObject);
  133. begin
  134.   Beep;
  135.   LoadQualifierSet(StrToInt(cboQuaID.Text));
  136. end;
  137.  
  138. procedure TfrmMain.btnNewClick(Sender: TObject);
  139. begin
  140.   cboQuaID.Text := '';
  141.   LoadQualifierSet(-1);  { force an empty set }
  142. end;
  143.  
  144. procedure TfrmMain.DBNavigator1BeforeAction(Sender: TObject;
  145.   Button: TNavigateBtn);
  146. begin
  147.   if Button = nbInsert then
  148.   begin
  149.     DemoDM.qryQualifiers.Append;
  150.     Abort;
  151.   end;
  152. end;
  153.  
  154. procedure TfrmMain.GenerateWhereClause(aQuaID: Integer; aWhereClause: TStrings);
  155. var
  156.   Query: TQuery;
  157.   ValueList: TStringList;
  158.   LastFilterType: Integer;
  159.   I: Integer;
  160.   FilterExpressions: TStringList;
  161.  
  162.   procedure AddFilter(aValues: TStrings; aFilters: TStrings);
  163.   var
  164.     I: Integer;
  165.     Expr: string;
  166.   begin
  167.     if aValues.Count = 1 then
  168.       aFilters.Add(Format('(%s)', [aValues[0]]))
  169.     else
  170.     begin
  171.       Expr := '';
  172.       for I := 0 to aValues.Count - 1 do
  173.       begin
  174.         Expr := Expr + '(' + aValues[I] + ')';
  175.         if I < aValues.Count - 1 then
  176.           Expr := Expr + ' OR '
  177.       end;
  178.       aFilters.Add(Format('(%s)', [Expr]));
  179.     end;
  180.     aValues.Clear;
  181.   end;
  182. begin
  183.   Query := TQuery.Create(nil);
  184.   ValueList := TStringList.Create;
  185.   FilterExpressions := TStringList.Create;
  186.   try
  187.     with Query do
  188.     begin
  189.       DatabaseName := DemoDM.Database1.DatabaseName;
  190.       SQL.Clear;
  191.       SQL.Add('SELECT *, qlfDataField');
  192.       SQL.Add('  FROM Qualifiers, QualifierFilters');
  193.       SQL.Add('  WHERE quaFilterID = qlfID AND');
  194.       SQL.Add('        quaID = ' + IntToStr(aQuaID));
  195.       SQL.Add('  ORDER BY quaFilterID');
  196.       Open;
  197.       try
  198.  
  199.         { Convert the qualifiers to expressions for the WHERE clause }
  200.         LastFilterType := -1;
  201.         while not Eof do
  202.         begin
  203.  
  204.           { There may be duplicates on filter ID which means we OR the values for the
  205.             same field }
  206.           if (LastFilterType <> -1) and (LastFilterType <> FieldByName('quaFilterID').AsInteger) then
  207.             AddFilter(ValueList, FilterExpressions);
  208.  
  209.           LastFilterType := FieldByName('quaFilterID').AsInteger;
  210.           ValueList.Add(Format('%s = "%s"',
  211.                                [FieldByName('qlfDataField').AsString,
  212.                                 FieldByName('quaCode').AsString]));
  213.  
  214.           Next;
  215.         end;
  216.         AddFilter(ValueList, FilterExpressions);
  217.       finally
  218.         Close;
  219.       end;
  220.  
  221.       { Build the WHERE clause }
  222.       with aWhereClause do
  223.       begin
  224.         Add('  WHERE ');
  225.         for I := 0 to FilterExpressions.Count - 1 do
  226.         begin
  227.           if I < FilterExpressions.Count - 1 then
  228.             Add('    ' + FilterExpressions[I] + ' AND')
  229.           else
  230.             Add('    ' + FilterExpressions[I]);
  231.         end;
  232.       end;
  233.     end;
  234.   finally
  235.     Query.Free;
  236.     ValueList.Free;
  237.     FilterExpressions.Free;
  238.   end;
  239. end;
  240.  
  241. procedure TfrmMain.btnExecuteQueryClick(Sender: TObject);
  242. begin
  243.   qrySubset.Open;
  244. end;
  245.  
  246. procedure TfrmMain.btnGenerateQueryClick(Sender: TObject);
  247. begin
  248.   with qrySubset do
  249.   begin
  250.     Close;
  251.     SQL.Clear;
  252.     SQL.Add('SELECT * FROM EmpComp');
  253.     GenerateWhereClause(StrToInt(cboQuaID.Text), SQL);
  254.     Memo1.Lines.Clear;
  255.     Memo1.Lines.AddStrings(SQL);
  256.   end;
  257. end;
  258.  
  259. end.
  260.